package br.org.acessobrasil.processoacessibilidade.bo;

import java.net.URL;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

import br.org.acessobrasil.ases.regras.RegrasHardCodedEmag;
import br.org.acessobrasil.http.Http;
import br.org.acessobrasil.processoacessibilidade.dao.LinkDao;
import br.org.acessobrasil.processoacessibilidade.dao.PaginaDao;
import br.org.acessobrasil.processoacessibilidade.vo.LinkPro;
import br.org.acessobrasil.processoacessibilidade.vo.PaginaPro;

public class Visitante {
	private static LinkDao linkDao;
	private static PaginaDao paginaDao;
	private static RegrasHardCodedEmag regras = new RegrasHardCodedEmag();
	
	private static Logger logger = Logger.getLogger(Visitante.class);
	
	private static Pattern patFrame = Pattern.compile("<(iframe|frame)\\s[^>]*>");
	private static Pattern patArea = Pattern.compile("<area\\s[^>]*>");
	
	public synchronized void visitarPagina(PaginaPro pagina) throws Exception{
		logger.debug("visitando " + pagina.getUrl());
		Http ppw = new Http();
		String conteudo = ppw.getContent(pagina.getUrl());
		
		ArrayList<LinkPro> lista = new ArrayList<LinkPro>();
		pagina.setListaLinks(lista);
		pagina.setCodOriginal(conteudo);
		pagina.setCodTrabalho(conteudo);
		pagina.setCodArquivo(conteudo);
		
		Matcher mat = Arquivista.PAT_A.matcher(conteudo);
		while(mat.find()){
			String url = regras.getAtributo(mat.group(), "href");
			adicionarUrl(url,pagina);
		}
		mat = patArea.matcher(conteudo);
		while(mat.find()){
			String url = regras.getAtributo(mat.group(), "href");
			adicionarUrl(url,pagina);
		}	
		mat = patFrame.matcher(conteudo);
		while(mat.find()){
			String url = regras.getAtributo(mat.group(), "src");
			adicionarUrl(url,pagina);
		}	
	}
	private void adicionarUrl(String url,PaginaPro pagina) throws Exception{
		try{
			//ver se a url e valida
			if(urlValida(url)){
				//nao criar paginas para arquivos
				if(!Arquivista.isArquivo(url)){
					URL url2 = new URL(new URL(pagina.getUrl()),url);
					String urlNormalizada =tratarUrl(url2.toString()); 
					LinkPro link = new LinkPro();
					PaginaPro pg = new PaginaPro();
					pg.setIdSitio(pagina.getIdSitio());
					pg.setUrl(urlNormalizada);
					PaginaPro tmp = paginaDao.find(urlNormalizada);
					if(tmp!=null){
						pg = tmp;
					}else{
						pg = paginaDao.create(pg);
					}
					link.setDestino(pg);
					link.setIdOrigem(pagina.getIdPagina());
					linkDao.create(link);
					pagina.getListaLinks().add(link);
				}
			}
		}catch(Exception e){
			logger.error("Nao foi possivel adicionar a url " + url,e);
		}
	}
	private boolean urlValida(String url){
		if(url.toLowerCase().startsWith("mailto:")) return false;
		if(url.toLowerCase().startsWith("javascript:")) return false;
		if(url.toLowerCase().trim().equals("javascript")) return false;
		if(url.startsWith("#")) return false;
		return true;
	}
	/**
	 * Trata o sustenido vulgo tralha e tambem espaco em branco 
	 * @param url
	 * @return url tratada
	 */
	private String tratarUrl(String url){
		int sustenido = url.indexOf("#");
		if(sustenido!=-1){
			url = url.substring(0, sustenido);
		}
		return url.replace(" ","%20");
	}
	
	public static LinkDao getLinkDao() {
		return linkDao;
	}
	
	public static void setLinkDao(LinkDao linkDao) {
		Visitante.linkDao = linkDao;
	}
	
	public static PaginaDao getPaginaDao() {
		return paginaDao;
	}
	
	public static void setPaginaDao(PaginaDao paginaDao) {
		Visitante.paginaDao = paginaDao;
	}
}
